核心代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| int pos ;
int temp;
for (int i = 0; i < arrays.length - 1; i++) {
pos = 0;
for (int j = 0; j < arrays.length - i; j++) {
if (arrays[j] > arrays[pos]) { pos = j; }
} temp = arrays[pos]; arrays[pos] = arrays[arrays.length - 1 - i]; arrays[arrays.length - 1 - i] = temp; }
|
1 选择排序
原理 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的数据元素排完。
一、第一趟排序
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的数据元素排完
首先,我们创建数组,找到它最大的值(这就很简单了):
1 2 3 4 5 6 7 8 9 10 11
| int[] arrays = {2, 3, 1, 4, 3, 5, 1, 6, 1, 2, 3, 7, 2, 3};
int max = 0;
for (int i = 0; i < arrays.length; i++) { if (arrays[i] > max) { max = arrays[i]; } }
|
随后这个最大的数和数组末尾的数进行交换:
1 2 3 4 5
| int temp; temp = arrays[11]; arrays[11] = arrays[13]; arrays[13] = temp;
|
那么经过第一趟排序,我们的最大值已经到了数组的末尾了。
二、第二趟排序
再次从数组获取最大的数(除了已经排好的那个}:
1 2 3 4 5 6
| int max2 = 0; for (int i = 0; i < (arrays.length - 1); i++) { if (arrays[i] > max2) { max2 = arrays[i]; } }
|
再将获取到的最大值与数组倒数第二位交换:
1 2 3
| temp = arrays[7]; arrays[7] = arrays[12]; arrays[12] = temp;
|
经过第二次排序,已经能够将数组最大两个数进行排序了
三、代码简化
从前两趟排序其实我们就可以摸出规律了:
- 一个数组是需要
n-1
趟排序的(因为直到剩下一个元素时,才不需要找最大值)
- 每交换1次,再次找最大值时就将范围缩小1
- 查询当前趟数最大值实际上不用知道最大值是多少(上面我查出最大值,还要我手动数它的角标),知道它的数组角标即可,交换也是根据角标来进行交换
第一趟:遍历数组14个数,获取最大值,将最大值放到数组的末尾[13]
第二趟:遍历数组13个数,获取最大值,将最大值放到数组倒数第二位[12]
….
数组有14个数,需要13趟排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| int pos ;
int temp;
for (int i = 0; i < arrays.length - 1; i++) {
pos = 0;
for (int j = 0; j < arrays.length - i; j++) {
if (arrays[j] > arrays[pos]) { pos = j; }
} temp = arrays[pos]; arrays[pos] = arrays[arrays.length - 1 - i]; arrays[arrays.length - 1 - i] = temp; }
|
Author:
John Doe
Permalink:
http://yoursite.com/2019/10/14/数据结构算法/数据结构与算法 总结笔记/6 排序算法/选择排序/
License:
Copyright (c) 2019 CC-BY-NC-4.0 LICENSE
Slogan:
Do you believe in DESTINY?